#ifndef _COUPLE_H_
#define _COUPLE_H_

////////////////////////////////////////////////////////////////////////////////
// Includes
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Namespaces
////////////////////////////////////////////////////////////////////////////////

namespace Types {

////////////////////////////////////////////////////////////////////////////////
// Implementation
////////////////////////////////////////////////////////////////////////////////

/**
 *  Generic couple class.
 *	This class creates a generic couple.
 */
template <typename T1, typename T2>
class Couple {

	public:

		/// Couple creation with default values
		Couple() {}

		/// Couple creation with initialisation values
		Couple(const T1 & first, const T2 & second) : first(first), second(second) {}

		/// Create a copy of the given instance
		template <typename T3, typename T4>
		Couple(const Couple<T3,T4> & inst)
		: first(static_cast<T1>(inst.GetFirst())), second(static_cast<T2>(inst.GetSecond())) {}
		
		/// Affectation operator
		template <typename T3, typename T4>
		Couple<T1,T2> & operator = (const Couple<T3,T4> & inst) {
			if (this != &inst) {
				this->first	= static_cast<T1>(inst.GetFirst());
				this->second = static_cast<T2>(inst.GetSecond());	
			}
			return *this;
		}
		
		/// Returns the first value
		T1 & First() { return this->first; }
		const T1 & GetFirst() const { return this->first; }
		
		/// Returns the second value
		T2 & Second() { return this->second; }
		const T2 & GetSecond() const { return this->second; }
		
	protected:
		
		/// First value
		T1 first;
		
		/// Second value
		T2 second;

};

////////////////////////////////////////////////////////////////////////////////
// Closing Namespaces
////////////////////////////////////////////////////////////////////////////////

}

////////////////////////////////////////////////////////////////////////////////

#endif
